﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Windows.Forms;

namespace oqis.core.common.file
{
    /// <summary>
    /// 类－－XML删除功能
    /// </summary>
    public partial class XMLOperator
    {
        #region 新建方法
        /// <summary>
        /// 新建一个带有根节点的 XML 文件
        /// </summary>
        /// <param name="xmlFilePath">XML文件路径</param>
        /// <param name="xmlRootNode">根节点名称</param> 
        public void CreateXMLFile(string xmlFilePath, string xmlRootNode)
        {
            // 判断
            if (System.IO.File.Exists(xmlFilePath) == true)
            {
                // 提示文件存在
                MessageBox.Show("文件 '" + xmlFilePath + "' 存在，无法新建！", "提示");
                return;
            }
            // 新建
            System.IO.StreamWriter streamWriter = new System.IO.StreamWriter(System.IO.File.Create(xmlFilePath));
            // 写入 XML 文件标记
            streamWriter.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?> ");

            // 写入根节点
            if (xmlRootNode == null || xmlRootNode == "") xmlRootNode = "Configuration";
            streamWriter.WriteLine("<" + xmlRootNode + ">");
            streamWriter.WriteLine("</" + xmlRootNode + ">");

            //	 释放
            streamWriter.Flush();
            streamWriter.Close();
        }
        /// <summary>
        /// 新建一个带有根节点的 XML 文件,并返回XMLDocument对象
        /// </summary>
        /// <param name="xmlFilePath">XML文件路径</param>
        /// <param name="xmlRootNode">根节点名称</param>
        /// <returns>返回XMLDocument对象</returns>
        public XmlDocument CreateXMLDocument(string xmlFilePath, string xmlRootNode)
        {
            // 建立XML文档
            CreateXMLFile(xmlFilePath, xmlRootNode);

            // 得到文档
            XmlDocument xmlDom = GetXMLDocument(xmlFilePath);
            return xmlDom;

        }
        /// <summary>
        /// 建立Xml节点
        /// </summary>
        /// <param name="xmlDom">XML文档对象</param>
        /// <param name="parentNode">父节点</param>
        /// <param name="nodeName">节点名称</param>
        /// <returns>返回一个XmlNode对象</returns>
        public XmlNode CreateXmlNode(XmlDocument xmlDom, XmlNode parentNode, string nodeName)
        {
            if (xmlDom == null || parentNode == null || nodeName == null) return null;
            // 建立节点
            XmlElement subNode = xmlDom.CreateElement(nodeName);
            subNode.InnerText = "";
            parentNode.AppendChild((XmlNode)subNode);
            // 返回结果
            return subNode;
        }
        /// <summary>
        /// 建立Xml节点
        /// </summary>
        /// <param name="xmlDom">XML文档对象</param>
        /// <param name="nodeName">节点名称</param>
        /// <returns>返回一个XmlNode对象</returns>
        public XmlNode CreateXmlNode(XmlDocument xmlDom, string nodeName)
        {
            if (xmlDom == null || nodeName == null) return null;
            // 建立节点
            XmlElement subNode = xmlDom.CreateElement(nodeName);
            subNode.InnerText = "";
            xmlDom.DocumentElement.AppendChild((XmlNode)subNode);
            //xmlDom.AppendChild((XmlNode)subNode);
            // 返回结果
            return subNode;
        }
        /// <summary>
        /// 新建XML节点
        /// </summary>
        /// <param name="xmlFile">XML文件</param>
        /// <param name="nodeName">节点名称</param>
        public void CreateXmlNode(string xmlFile, string nodeName)
        {
            // 判断
            XmlDocument xmlDom = null;
            if (System.IO.File.Exists(xmlFile) == false) xmlDom = CreateXMLDocument(xmlFile, "配置参数");
            if (xmlDom == null) return;

            // 建立节点
            CreateXmlNode(xmlDom, nodeName);
            // 保存
            xmlDom.Save(xmlFile);
        }
        /// <summary>
        /// 新建一个XML节点元素
        /// </summary>
        /// <param name="xmlFile">XML文档</param>
        /// <param name="elementName">节点元素名称</param>
        /// <param name="elementKey">节点元素属性"Key"值</param>
        /// <param name="elementValue">节点元素属性"Value"值</param>
        public bool CreateXmlElement(string xmlFile, string elementName, string elementKey, string elementValue)
        {
            // 判断
            if (xmlFile == null || elementName == null || elementKey == null || elementValue == null) return false;
            // 得到XML文档
            XmlDocument xmlDom = GetXMLDocument(xmlFile);
            if (xmlDom == null) return false;

            // 建立新元素
            CreateXmlElement(xmlDom, elementName, elementKey, elementValue);
            // 保存
            xmlDom.Save(xmlFile);
            // 返回结果
            return true;
        }
        /// <summary>
        /// 建立一个节点
        /// </summary>
        /// <param name="xmlDom">XML文档</param>
        /// <param name="elementName">节点名称</param>
        /// <param name="elementInnertext">内容</param>
        /// <returns>返回XmlElement</returns>
        public XmlElement CreateXmlElement(XmlDocument xmlDom, string elementName, string elementInnertext)
        {
            //建立一个节点 
            XmlElement element = xmlDom.CreateElement(elementName);
            element.InnerText = elementInnertext;
            return element;
        }
        /// <summary>
        /// 新建一个XML节点元素
        /// </summary>
        /// <param name="xmlDom">XML文档对象</param>
        /// <param name="elementName">节点元素名称</param>
        /// <param name="elementKey">节点元素属性"Key"值</param>
        /// <param name="elementValue">节点元素属性"Value"值</param>
        public void CreateXmlElement(XmlDocument xmlDom, string elementName, string elementKey, string elementValue)
        {
            // 第一步 得到XML文档
            if (xmlDom == null) return;

            // 第二步 得到节点
            XmlNode subNode = GetXmlNode(xmlDom, elementName);
            if (subNode == null) return;

            //第二步 添加新节点
            XmlElement xmlElement = xmlDom.CreateElement(elementName);
            xmlElement.SetAttribute("key", elementKey);
            xmlElement.SetAttribute("value", elementValue);
            subNode.AppendChild(xmlElement);
        }
        /// <summary>
        /// 得到XML文档
        /// </summary>
        /// <param name="xmlFile">XML文件路径</param>
        /// <returns>返回XmlDocument类型的对象XML文档</returns>
        public XmlDocument GetXMLDocument(string xmlFile)
        {
            // 得到XML文件
            if (System.IO.File.Exists(xmlFile) == false) this.CreateXMLFile(xmlFile, "配置参数");

            // 打开配置文件
            XmlDocument xmlDom = new XmlDocument();
            try
            {
                xmlDom.Load(xmlFile);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return null;
            }

            // 返回结果
            return xmlDom;
        }
        #endregion

        #region 删除方法
        /// <summary>
        /// 删除某节点下的所有子项
        /// </summary>
        /// <param name="xmlFile">XML文件</param>
        /// <param name="nodeName">指定的节点</param>
        public void RemoveChildNodes(string xmlFile, string nodeName)
        {
            // 得到节点          
            XmlNode xmlNode =GetXmlNode(xmlFile, nodeName);
            // 判断
            if (xmlNode == null) return;
            // 删除
            xmlNode.RemoveAll();
        }
        /// <summary>
        /// 删除节点
        /// </summary>
        /// <param name="xmlFile">XML文件</param>
        /// <param name="nodeName">节点名称</param>
        public void RemoveNode(string xmlFile, string nodeName)
        {
            // 判断
            if (System.IO.File.Exists(xmlFile) == false || nodeName == null) return;

            // 得到文档
            XmlDocument xmlDom = GetXMLDocument(xmlFile);
            if (xmlDom == null) return;

            // 得到节点
            XmlNode xmlNode = GetXmlNode(xmlDom, nodeName);
            // 判断
            if (xmlNode == null) return;
            // 删除
            xmlNode.ParentNode.RemoveChild(xmlNode);

            // 保存
            xmlDom.Save(xmlFile);
        }
        #endregion
    }
}
